package tv.acgn.advertisement.publish.service;

import org.springframework.stereotype.Service;
import tv.acgn.advertisement.publish.exception.AbstractAdPubException;
import tv.acgn.advertisement.publish.po.AdUnitPO;
import tv.acgn.advertisement.publish.vo.adunit.AdUnitDistrictRequestVO;
import tv.acgn.advertisement.publish.vo.adunit.AdUnitDistrictResponseVO;
import tv.acgn.advertisement.publish.vo.adunit.AdUnitInterestRequestVO;
import tv.acgn.advertisement.publish.vo.adunit.AdUnitInterestResponseVO;
import tv.acgn.advertisement.publish.vo.adunit.AdUnitKeywordRequestVO;
import tv.acgn.advertisement.publish.vo.adunit.AdUnitKeywordResponseVO;
import tv.acgn.advertisement.publish.vo.adunit.AdUnitRequestVO;
import tv.acgn.advertisement.publish.vo.adunit.AdUnitResponseVO;
import tv.acgn.advertisement.publish.vo.creative.CreativeUnitRequestVO;
import tv.acgn.advertisement.publish.vo.creative.CreativeUnitResponseVO;

/**
 * @author : junG
 * @program : advertisement-ad-pub-service
 * @description : 推广单元 业务接口
 * @date : 2019-05-25 23:54
 **/

@Service
public interface AdUnitService {

    /**
     * <h2>获取推广计划</h2>
     *
     * @param unitId [1] 推广单元识别码
     *
     * @return {@link AdUnitResponseVO}
     *
     * @throws AbstractAdPubException 异常
     * @author junG
     * @description 根据推广计划识别码 获取推广计划
     * @date 0:57 2019/5/26
     */
    AdUnitPO getAdUnit(String unitId) throws AbstractAdPubException;

    /**
     * <h2>创建推广单元</h2>
     *
     * @param requestVO 推广单元请求对象
     *
     * @return {@link AdUnitResponseVO} 推广单元响应对象
     *
     * @throws AbstractAdPubException 异常
     * @author junG
     * @description 创建一个新的推广单元
     * @date 0:22 2019/5/26
     */
    AdUnitResponseVO addAdUnit(AdUnitRequestVO requestVO) throws AbstractAdPubException;

    /**
     * <h2>变更推广单元</h2>
     *
     * @param requestVO [1] 推广单元请求对象
     *
     * @return {@link AdUnitResponseVO} 推广单元响应对象
     *
     * @throws AbstractAdPubException 异常
     * @author junG
     * @description 变更推广单元内容 包括 单元名 广告类型 预算等
     * @date 0:58 2019/5/26
     */
    AdUnitResponseVO updateAdUnit(AdUnitRequestVO requestVO) throws AbstractAdPubException;

    /**
     * <h2>删除推广单元</h2>
     *
     * @param unitId [1] 推广单元识别码
     *
     * @return {@link AdUnitResponseVO} 推广单元响应对象
     *
     * @throws AbstractAdPubException 异常
     * @author junG
     * @description 根据推广计划识别码 删除一个推广单元
     * @date 1:00 2019/5/26
     */
    AdUnitResponseVO deleteAdUnit(String unitId) throws AbstractAdPubException;

    /**
     * <h2>创建推广单元关联关键词</h2>
     *
     * @param requestVO [1] 推广单元关联关键词请求对象
     *
     * @return {@link AdUnitKeywordResponseVO} 推广单元关联关键词响应对象
     *
     * @throws AbstractAdPubException 异常
     * @author junG
     * @description 创建推广计划关键词 支持批量创建
     * @date 2:07 2019/5/26
     */
    AdUnitKeywordResponseVO addAdUnitKeyword(AdUnitKeywordRequestVO requestVO) throws AbstractAdPubException;

    /**
     * <h2>创建推广计划兴趣列表</h2>
     *
     * @param requestVO [1] 推广单元关联兴趣列表请求对象
     *
     * @return {@link AdUnitInterestResponseVO} 推广单元关联兴趣列表响应对象
     *
     * @throws AbstractAdPubException 异常
     * @author junG
     * @description 创建推广计划兴趣列表 支持批量创建
     * @date 2:07 2019/5/26
     */
    AdUnitInterestResponseVO addAdUnitInterest(AdUnitInterestRequestVO requestVO) throws AbstractAdPubException;

    /**
     * <h2>创建推广计划 关联地区属性</h2>
     *
     * @param requestVO [1] 推广单元关联地区请求对象
     *
     * @return {@link AdUnitDistrictResponseVO} 推广单元关联地区响应对象
     *
     * @throws AbstractAdPubException 异常
     * @author junG
     * @description 创建推广计划 关联地区属性 支持批量创建
     * @date 2:08 2019/5/26
     */
    AdUnitDistrictResponseVO addAdUnitDistrict(AdUnitDistrictRequestVO requestVO) throws AbstractAdPubException;

    /**
     * <h2>创建创意与推广单元的联系</h2>
     *
     * @param requestVO [1] 创意关联推广单元请求对象
     *
     * @return {@link CreativeUnitResponseVO} 创意关联推广单元响应对象
     *
     * @throws AbstractAdPubException 异常
     * @author junG
     * @description 创建创意与推广单元的联系
     * @date 0:46 2019/6/2
     */
    CreativeUnitResponseVO addCreativeUnit(CreativeUnitRequestVO requestVO) throws AbstractAdPubException;
}
